package controllers;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

import model.Lugar;
import model.Pais;
import model.Partida;
import model.Pista;
import model.Villano;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;
import GameData.CasoAppModel;
import GameData.DataGen;
import GameData.VillanosAppModel;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * Brindando servicios para viajar, obtenerCaso,
 * 	consultar las pistas de un lugar y Generar ordenes de Arresto
 */
public class Application extends Controller {
	
	private static List<Partida> partidas = new ArrayList<Partida>();
	
	
	
	public static Result obtenerCaso(){
		response().setContentType("application/json");
		
		Partida nuevaPartida = DataGen.nuevaPartida();
		
		Application.getPartidas().add(nuevaPartida);
		
		int ID = Application.getPartidas().size() - 1 ;
		
		CasoAppModel caso = new CasoAppModel(ID);
		caso.armarCaso(nuevaPartida);
		
		JsonNode json = Json.toJson(caso);
		
		return ok(json);
	}
	
	
	public static Result obtenerVillanos(int id){
		response().setContentType("application/json");
		
		Partida partida = getPartidas().get(id);
		
		VillanosAppModel villanos = new VillanosAppModel(partida);
		
		JsonNode json = Json.toJson(villanos);
		
		return ok(json);
	}
	
	
	
	public static Result viajar(String pais){
		response().setContentType("application/json");
		JsonNode node = request().body().asJson();
		
		int ID = Json.fromJson(node, Integer.class); //Armo el caso que me envia el cliente.
		Partida partida = getPartidas().get(ID);
		
		Pais paisAViajar = partida.getMapamundi().buscar(pais);
			
			partida.moverVillanoSiEsNecesario(paisAViajar);
			partida.getDetective().viajarAlSiguientePais(paisAViajar);
			
			CasoAppModel caso = new CasoAppModel(ID);
			caso.armarCaso(partida);
			JsonNode json = Json.toJson(caso);
			
		return ok(json);
	}
	
	
	public static Result emitirOrdenContra(String villano){
		response().setContentType("application/json");
		JsonNode node = request().body().asJson();
		
		int ID = Json.fromJson(node, Integer.class);
		Partida partida = getPartidas().get(ID);
		
		try {			
			Villano villanoAcusado = partida.getBddVillano().buscar(villano);
			partida.getDetective().generarOrdenDeArrestoPara(villanoAcusado);
		
		} catch (NoSuchElementException e){
			
			return ok(crearJsonError("El villano no existe"));
		
		}
		
			return ok(crearJsonOk());
		
	}

	
	public static Result consultarLugar(int ID, String lugar){
		response().setContentType("application/json");
		
		Partida partida = getPartidas().get(ID);
		
	try {
		Lugar lugarAux = encontrarLugar(partida, lugar);
		List<Pista> pistas = lugarAux.consultar();
		
		JsonNode json = Json.toJson(pistas);
		
			return ok(json); //Resultado a menos que se levante una excepción.
	
		} catch (NullPointerException e){
				return ok(crearJsonError("El lugar no es valido"));
		}
	}

	
// utils
    
    protected static ObjectNode crearJsonError(String message) {
    	ObjectNode result = Json.newObject();
		result.put("error", message);
		return result;
	}
    

	protected static ObjectNode crearJsonOk() {
    	ObjectNode result = Json.newObject();
		result.put("status", "OK");
		return result;
	}


	protected static Lugar encontrarLugar(Partida partida, String lugar){
		Lugar lugarAux = null;
		for (Lugar aLugar : partida.getDetective().getPaisActual().getLugaresInteresantes()) {
			if (aLugar.getNombre().equalsIgnoreCase(lugar) ) lugarAux = aLugar;
		}
			return lugarAux;
	}
	
	protected static List<Partida> getPartidas() {
		return partidas;
	}
	
    
}
